/**
  ******************************************************************************
  * File Name          : MODBUS Discrete【0x02】
  * Auther             : xifeng.yao@qq.com
  * Description        : Code for modbus applications
  ******************************************************************************
  * @attention
  * if(应用中 不需要用到离散寄存器(Discrete))
  * {
  *   不要将这个.c文件，加入工程中编译;
  * }
  * else if(应用中 需要用到离散寄存器(Discrete))
  * { 
  *   必须将这个.c文件，加入工程中编译;
  *   通过全局变量【ucRegDiscreteBuf】进行数据交互;
  * }
  
  * @special:
  * 对应头文件中包含全局变量 【ucRegDiscreteBuf】 中的数据，请在应用线程中填充、修改、保存。
  *
  * @special:
  * 部分应用中，将离散寄存器和线圈寄存器做成同一地址表，可以在头文件中进行相应配置
  * 
  ********/
	
/* Includes ------------------------------------------------------------------*/
#include <string.h>

#include "litemodbusBase.h"
#include "liteModbus_Discrete.h"


#if DISCRETE_INPUT_INDEPEND
bool ucRegDiscreteBuf[DISCRETE_REG_SIZE];  //变量表
#endif

/**
  * @brief  Modbus 0x01 0x02 0x05 0x0f 协议解析 
  * @param  *response    指向数据帧，帧头
             int_value   0x01      读协议，需要应答的数据 
            *ext_value   0x05,0x0f 写协议，需要返回的数据 
  * @retval true=解析完成，下一步应答
            false=未解析完成，下一个寄存器地址
  */
extern bool Modbus_Coils_Addr_Analy(uint8_t* response, int int_value, void* ext_value);

/**
  * @brief  
  * @param  modbus 数据结构体
  * @retval true or false
  */                              
bool Modbus_Discrete_Analy(char* input) 
{
  ModbusFormat* data = (ModbusFormat*)input;
  
  uint16_t addrbuff = (uint16_t)(data->addr[0])<<8 | data->addr[1]; //小端地址,解析用临时变量
  bool     bitresult; //解析返回状态

  /*
    以下代码是针对变量地址解析，且按照一组连续变量地址进行解析模板
	
	  实际应用中可能会有分多段变量地址的情况，那么需要使用者自行修改
	  每个变量地址【addrbuff】调用【Modbus_Coils_Addr_Analy】处理即可。
  */
#if DISCRETE_REG_STARTADDR
  if(addrbuff < DISCRETE_REG_STARTADDR)  {ERR_ADDR(input)   return true;}
  addrbuff -= DISCRETE_REG_STARTADDR;
#endif
  do{
    if(addrbuff > DISCRETE_REG_SIZE)  {ERR_ADDR(input)   return true;}
    
    bitresult = Modbus_Coils_Addr_Analy((uint8_t*)data, ucRegDiscreteBuf[addrbuff], NULL); //对应【地址addrbuff】与【变量ucRegDiscreteBuf】关系
    addrbuff++;  
  }while(!bitresult);
  
  return true;
}
